﻿using System;
using System.Collections.Generic;
using System.Text;

namespace daStaticAnalyser.Analysers
{
    using daStaticAnalyser.Analysers;
    using daStaticAnalyser;
    using daBase.Objects;
    using daBase.Analyser;
    using daSyntaxAnalyser;
    using daSyntaxAnalyser.SyntaxTree;

    [AnalyserDefaultSettings("Тестовый анализатор", "test", 0, "test")]
    class ChidamberCamererAnalyzator : BaseStaticAnalyser
    {
        List<ДанныеКласса> Классы = new List<ДанныеКласса>();
        
        protected override void DoAnalyse(SyntaxTreeArgs e)
        {
            if (e.Element is TypeDeclarationsElement)
            {
                foreach (var temp in (e.Element as TypeDeclarationsElement))
                {
                    if (temp is TypeDeclarationElement)
                    {
                        var TypeDeclaration = temp as TypeDeclarationElement;
                        String ClassName = TypeDeclaration.Id.Text;//Имя предпологаемого класса
                        String File = temp.StartInfo.File;
                        int BeginLineOfClass = temp.StartInfo.Line;
                        
                        if (TypeDeclaration.Definition is FullClassDefinitionElement)//Если это класс
                        {
                            var FullClassDefinition = TypeDeclaration.Definition as FullClassDefinitionElement;
                            Классы.Add(new ДанныеКласса(ClassName, File, BeginLineOfClass));
                            if (FullClassDefinition.Parents.Count == 1)
                            {
                                Классы[Классы.Count - 1].ДобавитьПредка(FullClassDefinition.Parents[0].Id.Text);
                            }
                            ДанныеКласса buf = null;
                            if ((buf = Классы.Find(s => s.ClassName == Классы[Классы.Count - 1].ТекущийПредок)) != null)
                            {
                                foreach (String str in buf.ЦепочкаНаследования) Классы[Классы.Count - 1].ДобавитьПредка(str);
                            }
                            buf = null;
                            if ((buf = Классы.Find(s => s.ТекущийПредок == Классы[Классы.Count - 1].ClassName)) != null)
                            {
                                foreach (String str in Классы[Классы.Count - 1].ЦепочкаНаследования) buf.ДобавитьПредка(str);    
                            }
                            
                            int CountMethodsOfClass = 0;//Количество методов класса
                            //Перебор всех секций класса ClassName
                            foreach (var section in FullClassDefinition.Sections)
                            {
                                //Перебор всех элементов секции
                                foreach (var element in (section as ClassSectionElement).Elements)
                                {
                                    if ((element is InnerFunctionHeadElement) ||
                                       (element is InnerProcedureHeadElement))
                                    {
                                        CountMethodsOfClass++;    
                                    }
                                }
                            }
                            //AddMetric("Количество методов класса", CountMethodsOfClass, ClassName, File, BeginLineOfClass);
                        }
                    }
                }
            }
        }

        protected override void DoFinishAnalyse(EventArgs e)
        {
            foreach (var temp in Классы)
            {
                AddMetric("Глубина наследования класса", temp.ГлубинаНаследования, temp.ClassName, temp.File, temp.Line);    
            }
        }
    }
}
